const Common = require('./common');//引入公共方法
const StudentModel = require('../models/student');//引入admin表的model层
const Constant = require('../constant/constant');//引入常量
const dateFormat = require('dateformat');//引入dateformat包
const Token = require('./token');//引入Token处理方法
const Token_Expire_Sencond = 86400;//设定默认Token过期时间，单位为秒

//配置对象
let exportObj = {
    login,
    register,
    test
};

module.exports = exportObj;

function login(req, res) {
    const resObj = Common.clone(Constant.DEFAULT_SUCCESS); //定义一个成功返回对象
    //定义一个async任务(本质上tasks是一个函数数组)
    let tasks = {
        //校验参数方法
        checkParams: (cb) => {
            //调用公共方法中的校验参数方法，如果成功则进行后续操作
            //如果失败，则传递错误信息到async的最终方法中
            Common.checkParams(req.body, ['username', 'password'], cb);
        },

        //查询方法
        query: ['checkParams', (results, cb) => {
            StudentModel
                .findOne({
                    where: {
                        username: req.body.username,
                        password: req.body.password
                    }
                })
                .then(function (result) {
                    //查询结果处理
                    if (result) {
                        //如果查询到了结果
                        //组装数据，并将查询结果组装到成功返回的数据中
                        resObj.data = {
                            username: result.username,
                            password: result.password,
                            studentNo: result.id,
                            studentName: result.studentname,
                            classNo: result.class,
                            role: result.role,
                        };
                        //将admin的id保存在Token中
                        const adminInfo = {
                            id: result.id
                        };
                        //生成Token
                        let token = Token.encrypt(adminInfo, Token_Expire_Sencond);
                        resObj.data.token = token;//将Token保存在返回对象中并返回前端
                        cb(null, result.id);
                    } else {
                        //没有查询到结果，传递错误信息到async的最终方法中
                        cb(Constant.LOGIN_ERROR);
                    }
                })
                .catch(function (err) {
                    //错误处理
                    console.log(err);
                    cb(Constant.DEFAULT_ERROR)
                })
        }],
    };
    //Common.autoFn(tasks, res. resObj)
    Common.autoFn(tasks, res, resObj);
}

function register(req, res) {
    // 定义一个返回对象
    const resObj = Common.clone(Constant.DEFAULT_SUCCESS);
    // 定义一个async任务
    let tasks = {
        // 校验参数方法
        checkParams: (cb) => {
            // 调用公共方法中的校验参数方法，成功继续后面操作，失败则传递错误信息到async最终方法
            Common.checkParams(req.body, ['username', 'password', 'classNo', 'studentNo', 'studentName'], cb);
        },
        // 添加方法，依赖校验参数方法
        add: cb => {
            // 使用wish的model中的方法插入到数据库
            StudentModel
                .create({
                    id: req.body.studentNo,
                    username: req.body.username,
                    password: req.body.password,
                    class: req.body.classNo,
                    studentname: req.body.studentName,
                    role: 'user',
                })
                .then(function (result) {
                    // 插入结果处理
                    // 继续后续操作
                    cb(null);
                })
                .catch(function (err) {
                    // 错误处理
                    // 打印错误日志
                    console.log(err);
                    // 传递错误信息到async最终方法
                    cb(Constant.DEFAULT_ERROR);
                });
        },
    }
    //Common.autoFn(tasks, res. resObj)
    Common.autoFn(tasks, res, resObj);
}

// 验证账号等是否重复
function test (req, res) {
    // 定义一个返回对象
    const resObj = Common.clone (Constant.DEFAULT_SUCCESS);
    // 定义一个async任务
    let tasks = {
      // 校验参数方法
      checkParams: (cb) => {
          //跳过检验参数
          cb(null)
      },
      // 查询方法，依赖校验参数方法
      query: ['checkParams', (results, cb) => {
        StudentModel
          .findAll()
          .then (function (result) {
           // 查询结果处理
          // 定义一个空数组list，用来存放最终结果
          let list = [];
          // 遍历SQL查询出来的结果，处理后装入list
          result.forEach ((v, i) => {
            let obj = {
              studentNo: v.id,
              username: v.username,
              studentName: v.studentname,
            };
            list.push (obj);
          });
          // 给返回结果赋值，包括列表和总条数
          resObj.data = {
            list,
          };
            // 继续后续操作
            cb (null);
          })
          .catch (function (err) {
            // 错误处理
            // 打印错误日志
            console.log (err);
            // 传递错误信息到async最终方法
            cb (Constant.DEFAULT_ERROR);
          });
  
      }]
    };
    // 执行公共方法中的autoFn方法，返回数据
    Common.autoFn (tasks, res, resObj)
  
  }
  